-- $LastChangedDate: 2007-06-03 12:04:05 +0200 (Sun, 03 Jun 2007) $
-- $LastChangedRevision: 159 $
-- $LastChangedBy: david $

-- packages de ada
WITH Ada.Text_Io;
USE Ada.Text_Io;

-- packages del gimnasio
WITH Tiposprotegidos.Log;
USE Tiposprotegidos.Log;

PACKAGE BODY Tareas.Consola IS

   TASK BODY Consola IS
      Salir : Boolean := False;

      Valor       : Natural;
      Porcentaje  : Integer;
      Mo_Cantidad : Float   := 0.0;
      A_Cantidad  : Float   := 0.0;
      Me_Cantidad : Float   := 0.0;
      -- filas extra
      C_Cantidad       : Float   := 0.0;
      C_Finalizados    : Float;
      C_Finalizados_C3 : Integer;
      -- amplitud de las columnas
      C1          : CONSTANT Integer := 30;
      C2          : CONSTANT Integer := 5;
      C3          : CONSTANT Integer := 5;
      Delimitador : CONSTANT String  := " | ";
      C1_Titulo   : CONSTANT String  := "CONTADOR";
      C2_Titulo   : CONSTANT String  := "VALOR";
      C3_Titulo   : CONSTANT String  := "%";
   BEGIN

      WHILE NOT Salir LOOP
         SELECT
            ACCEPT Acabar DO
               Salir:= True;
               Print_Term("consola: Van a cerrar el gimnasio");
            END Acabar;
         ELSE
            IF NOT Pause_Signal THEN
               New_Line(25);
               -- barra superior 1
               FOR I IN 1..C1+C2+C3+(3*Delimitador'Length)-1 LOOP
                  Put("_");
               END LOOP;
               New_Line;
               -- titulos
               Put_Line(Pad(C1_Titulo, C1)& Delimitador & Pad(C2_Titulo, C2)&Delimitador& Pad(C3_Titulo, C3)&Delimitador);
               -- barra superior 2
               FOR I IN 1..C1+C2+C3+(3*Delimitador'Length)-1 LOOP
                  Put("_");
               END LOOP;
               New_Line;

               -- CONTADORES
               C_Finalizados := 0.0;
               FOR I IN Rango_Contadorlog'First..Rango_Contadorlog'Last LOOP
                  Valor:= Log_Read(I);
                  Put(Pad(""&I, C1)& Delimitador & Pad(Natural'Image(Valor), C2)&Delimitador);
                  -- C3
                  CASE I IS
                     WHEN Cliente_Entrevistado | Cliente_Vete_A_Casa | Cliente_Entreno_Completo | Cliente_Muerto =>
                        IF C_Cantidad /= 0.0 THEN
                           Porcentaje := Integer((Float(Valor) / C_Cantidad) * 100.0);
                        ELSE
                           Porcentaje := 0;
                        END IF;
                        Put_Line(Pad(Integer'Image(Porcentaje), C3)& Delimitador);
                     WHEN Monitor_Libre =>
                        IF Mo_Cantidad /= 0.0 THEN
                           Porcentaje := Integer((Float(Valor) / Mo_Cantidad) * 100.0);
                        ELSE
                           Porcentaje := 0;
                        END IF;
                        Put_Line(Pad(Integer'Image(Porcentaje), C3)& Delimitador);
                     WHEN Aparato_Libre =>
                        IF A_Cantidad /= 0.0 THEN
                           Porcentaje := Integer((Float(Valor) / A_Cantidad) * 100.0);
                        ELSE
                           Porcentaje := 0;
                        END IF;
                        Put_Line(Pad(Integer'Image(Porcentaje), C3)& Delimitador);
                     WHEN Medico_Libre =>
                        IF Me_Cantidad /= 0.0 THEN
                           Porcentaje := Integer((Float(Valor) / Me_Cantidad) * 100.0);
                        ELSE
                           Porcentaje := 0;
                        END IF;
                        Put_Line(Pad(Integer'Image(Porcentaje), C3)& Delimitador);
                     WHEN OTHERS =>
                        Put_Line(Pad("", C3)& Delimitador);
                  END CASE;

                  -- almacenar valores para porcentajes
                  CASE I IS
                     WHEN Cliente_Cantidad =>
                        C_Cantidad:= Float(Valor);
                     WHEN Cliente_Vete_A_Casa | Cliente_Entreno_Completo | Cliente_Muerto=>
                        C_Finalizados := C_Finalizados + Float(Valor);
                     WHEN Monitor_Cantidad =>
                        Mo_Cantidad := Float(Valor);
                     WHEN Aparato_Cantidad =>
                        A_Cantidad := Float(Valor);
                     WHEN Medico_Cantidad =>
                        Me_Cantidad := Float(Valor);
                     WHEN OTHERS =>
                        NULL;
                  END CASE;
               END LOOP;

               -- PORCENTAJES
               -- total de clientes finalizados
               IF C_Cantidad /= 0.0 THEN
                  C_Finalizados_C3 := Integer((C_Finalizados / C_Cantidad) * 100.0);
                  Put_Line(Pad("Clientes Finalizados", C1) & Delimitador & Pad(Integer'Image(Integer(C_Finalizados)), C2)&Delimitador&Pad(Integer'Image(C_Finalizados_C3), C3)& Delimitador);
               END IF;

               -- barra inferior
               FOR I IN 1..C1+C2+C3+(3*Delimitador'Length)-1 LOOP
                  Put("_");
               END LOOP;
               New_Line;
            END IF;

            DELAY T_Refresh_Time;
         END SELECT;
      END LOOP;
   EXCEPTION
      WHEN Ocurrencia : OTHERS =>
         Put_Line ("Consola: "&Ada.Exceptions.Exception_Information (Ocurrencia));
   END Consola;

END Tareas.Consola;
